package br.com.sgc.entities.produto;

import java.io.Serializable;
import java.math.BigDecimal;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "produto_composto", schema="produto")
public class ProdutoComposto implements Serializable{

	private static final long serialVersionUID = 5457264921400685974L;
	
	@Id 
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ")
	@SequenceGenerator(schema = "produto", initialValue = 1, name = "SEQ", sequenceName = "produto.seq_produto_composto", allocationSize = 1)
	private Long id;
	
	@Column(name = "nome_produto_composto")
	private String nomeProdutoComposto;
	
	@JoinColumn(name = "produto_id")
	private ProdutoFinal produto = new ProdutoFinal();
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "composicao_produto_id")
	private ComposicaoProduto composicao = new ComposicaoProduto();
	
	@Column(name = "quantidade_produto")
	private BigDecimal quantidadeProduto;
	
	@Column(name = "valor_produto")
	private BigDecimal valorProduto;
	
	@Column(name = "utiliza_mao_de_obra")
	private Boolean utilizaMaoDeObra;
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public ProdutoFinal getProduto() {
		return produto;
	}

	public void setProduto(ProdutoFinal produto) {
		this.produto = produto;
	}

	public ComposicaoProduto getComposicao() {
		return composicao;
	}

	public void setComposicao(ComposicaoProduto composicao) {
		this.composicao = composicao;
	}

	public String getNomeProdutoComposto() {
		return nomeProdutoComposto;
	}

	public void setNomeProdutoComposto(String nomeProdutoComposto) {
		this.nomeProdutoComposto = nomeProdutoComposto;
	}

	public Boolean getUtilizaMaoDeObra() {
		return utilizaMaoDeObra;
	}

	public void setUtilizaMaoDeObra(Boolean utilizaMaoDeObra) {
		this.utilizaMaoDeObra = utilizaMaoDeObra;
	}
	

	public BigDecimal getQuantidadeProduto() {
		return quantidadeProduto;
	}

	public void setQuantidadeProduto(BigDecimal quantidadeProduto) {
		this.quantidadeProduto = quantidadeProduto;
	}

	public BigDecimal getValorProduto() {
		return valorProduto;
	}

	public void setValorProduto(BigDecimal valorProduto) {
		this.valorProduto = valorProduto;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((produto == null) ? 0 : produto.hashCode());
		result = prime
				* result
				+ ((quantidadeProduto == null) ? 0 : quantidadeProduto
						.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		ProdutoComposto other = (ProdutoComposto) obj;
		if(this.getId() != null){
			return this.getId().equals(other.getId());
		}
		
		if(this.getProduto() != null && this.getProduto().getId() != null){
			return this.getProduto().getId().equals(other.getProduto().getId());
		}
		
		if(this.getNomeProdutoComposto() != null && !this.getNomeProdutoComposto().isEmpty()){
			return this.getNomeProdutoComposto().equals(other.getNomeProdutoComposto());
		}
		
		return true;
	}
	

}

